驱动程序
有了所有这些程序片段之后,我们还需要一个驱动程序,以便使所有的事情能够开始。对这个简单的例子,main()就可以完成这件事:
int main()
{
table["pi"] = 3.1415926535897932385; // 插入预定义的名字
table["e"] = 2.7182818284590452354;
while(cin)
{
get_token();
if(curr_tok == END) break;
if(curr_tok == PRINT) continue;
cout << expr(false) << '\n';
}
return no_of_errors;
}
按照惯例,main()在正常结束时应该返回0,否则就返回非0(3.2节)。返回出现的错误数正好与此相符。在这里,需要做的初始化工作只有将一些预定义的名字插入符号表中。
主循环的基本工作就是读入表达式并写出回答,这可以由下面一行完成:
cout << expr(false) << '\n';
参数false告诉expr()它无须调用get_token()去取得要用的单词。
每次循环都需要检测cin,这样就能保证在输入流出了什么问题时使程序结束。检测END则保证在get_token()遇到文件结束时能正确地退出循环。一个break语句将导致退出最内层的switch语句或者循环(即,for语句、while语句或者do语句)。检测PRINT(即'\n'或者';')将使expr()不必去处理空的表达式。continue语句等价于跳到循环的最后,所以在这里的
while(cin) {
// ...
if(curr_tok == PRINT) continue;
cout << expr(false) << '\n';
}
等价于
while(cin)
{
// ...
if(curr_tok != PRINT)
cout << expr(false) << '\n';
}
🔚